package com.qk.exception;

import com.qk.common.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**                                                     异常对象.getMessage()  --->  获取异常信息         25行
 * 【全局异常处理器】                                       字符串.indexOf(String) ---> 获取指定字符串位置     27行
 */
@Slf4j
@RestControllerAdvice                                  //@RestControllerAdvice ---> 标识：这是一个全局异常处理类
public class GlobalExceptionHandler { // 类名叫什么无所谓           ↓ = @ControllerAdvice + @ResponseBody     异常处理方法的返回值会转换为json后再响应给前端
    // 1. 【捕获--处理所有异常】                                                                                       ↓(返回的是Result对象，因此需要这个)
    @ExceptionHandler                                  // @ExceptionHandler ---> 标识：这是一个异常处理的方法，就是来捕获异常的
    public Result ex(Exception e){                     // 括号里写异常的处理类型 ---> 这里写Exception意为：捕获所有异常，任何异常的出现，都会经过这个方法处理一次
        log.error("服务器发生异常", e);
        return Result.error("畜生！代码有bug👿");   // 【Result.error】：都出现异常了，当然是响应error回去啊
    }

    // 2. 【捕获--重复键异常】   【二次完善】全局异常处理返回前端精确的信息提示，方便用户知晓问题所在
    @ExceptionHandler
    public Result handleDuplicateKeyException(DuplicateKeyException e){     //多异常处理方法匹配到异常时，子类异常处理器优先(只处理一次，子类处理后，父类就不处理了)。
        String errMsg = e.getMessage();
        if(errMsg.contains("Duplicate entry")){
            String msg = errMsg.substring(errMsg.indexOf("Duplicate entry"));
            String[] arr = msg.split(" ");       // “Duplicate entry '公关部' for key...” 截取字符串--以空格为分隔符，取第三个元素(索引为2)
            return Result.error(arr[2] + " 已存在");
        }
        return Result.error("对不起, 服务端异常, 请稍后重试 !!");
    }




    // 处理业务异常BusinessException(没懂)
    @ExceptionHandler
    public Result handleBusinessException(BusinessException e){
        log.error("业务异常", e.getMessage(), e);
        return Result.error(e.getMessage());
    }
}
